#include<iostream>
#include<unistd.h>
#include<fcntl.h>

using namespace std;

#define NUM 1024
bool SetNoBlock(int fd) {
    //获取文件描述符的属性信息
    int f1 = fcntl(fd, F_GETFL);
    if (f1 < 0) {
        cerr << "fcntl error!" << endl;
        return false;
    }
    //设置文件描述符的属性信息为非阻塞
    fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
    return true;
}

int main() {
    char buffer[NUM];
    SetNoBlock(0);
    while (true) {
        int size = read(0, buffer, sizeof(buffer) - 1);
        if (size < 0) {                                       //不一定出错
            if (errno == EAGAIN || errno == EWOULDBLOCK) {    //没有数据就绪
                cout << "没有数据输入，再次轮询检测 。。。" << endl;
                sleep(1);
                continue;
            }
            else if (errno == EINTR) {
                std::cout << "被信号打断" << std::endl;
                continue;
            }
            else {                                           //出错返回
                cerr << "读取失败 :" << size << endl;
                break;
            }
        }
        buffer[size] = 0;
        //回显
        cout << "echo# " << buffer;
    }
    return 0;
}
